package cn.iocoder.yudao.module.wms.service.unit;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.wms.controller.admin.unit.vo.UnitPageReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.unit.vo.UnitSaveReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.unit.UnitDO;
import cn.iocoder.yudao.module.wms.dal.mysql.unit.UnitMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;

import java.util.Collection;
import java.util.Collections;
import java.util.List;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.*;

/**
 * 计量单位 Service 实现类
 *
 * @author 曾劲松
 */
@Service
@Validated
public class UnitServiceImpl implements UnitService {

    @Resource
    private UnitMapper unitMapper;

    @Override
    public Long createUnit(UnitSaveReqVO createReqVO) {
        // 校验编码存在
        validateUnitCodeExists(createReqVO);
        // 插入
        UnitDO unit = BeanUtils.toBean(createReqVO, UnitDO.class);
        unitMapper.insert(unit);
        // 返回
        return unit.getId();
    }

    @Override
    public void updateUnit(UnitSaveReqVO updateReqVO) {
        // 校验存在
        validateUnitExists(updateReqVO.getId());
        // 校验编码存在
        validateUnitCodeExists(updateReqVO);
        // 更新
        UnitDO updateObj = BeanUtils.toBean(updateReqVO, UnitDO.class);
        unitMapper.updateById(updateObj);
    }

    @Override
    public void deleteUnit(Long id) {
        // 校验存在
        validateUnitExists(id);
        // 删除
        unitMapper.deleteById(id);
    }

    private void validateUnitExists(Long id) {
        if (unitMapper.selectById(id) == null) {
            throw exception(UNIT_NOT_EXISTS);
        }
    }

    private void validateUnitCodeExists(UnitSaveReqVO reqVO) {
        if (unitMapper.selectCountByCode(reqVO) > 0) {
            throw exception(UNIT_CODE_EXISTS);
        }
    }

    @Override
    public UnitDO getUnit(Long id) {
        return unitMapper.selectById(id);
    }

    @Override
    public List<UnitDO> getUnitList(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return Collections.emptyList();
        }
        return unitMapper.selectBatchIds(ids);
    }

    @Override
    public PageResult<UnitDO> getUnitPage(UnitPageReqVO pageReqVO) {
        return unitMapper.selectPage(pageReqVO);
    }

    @Override
    public List<UnitDO> getUnitList() {
        return unitMapper.selectList();
    }

}